/*3.3            Opcão 3:  Listar o arquivo de dados no formato variável
Nesta opção deve ser mostrada uma lista dos registros do arquivo de dados variável. A lista deve conter todas as informações da estrutura definida no item 2. Com essa lista  o usuário poderá acompanhar e “debugar” se o arquivo está no formato correto. Embora as informações dependam da estrutura escolhida no item 2,    poderão ser úteis as seguintes informações:  posição (byte) do arquivo onde inicia o registro; situação do registro (“removido” ou “válido”), tamanho, em  bytes, do registro; campo, tamanho do campo, conteúdo do campo.*/

/* Manipulação de arquivos com registros de tamanho fixo, campos de tamanho fixo e campos de tamanho variável sem marcadores especiais  tanto de fim de registro e como de  final de campo;*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char** strtoken(char *str, int *n)
{
        int i=0;
        //*n=0;
	int t;
        int tamstr = strlen(str);
        char** array_of_string;

        array_of_string = (char**)malloc(sizeof(char*)*(tamstr+1));

        for(i=0; i<tamstr; i++){
                array_of_string[i]= (char*)malloc(sizeof(char)*(tamstr+1));
        }
  
        array_of_string[0]=strtok(str," ");
  
  for(t=1;t<*n;t++)
  {
    array_of_string[t]=strtok(NULL," ");
    if(array_of_string[t]==NULL)
    {
      break;
    }
  }
  
  return array_of_string;
}

/*funcao que pega o numero de campos do arquivo de configuracao*/
int Le_num_campo(char *file_name)
{
    FILE *ap_file;
    int n=0; //n contera o numero de campos
    
    ap_file = fopen(file_name, "r");
    
    fseek (ap_file, 0, SEEK_SET); //anda n bytes ate achar o numero de campos
    fscanf (ap_file,"%d",&n); //coloca o numero de campos em n.
    
    fclose(ap_file);
    return n;
}

/*funcao que le o nome de cada campo e coloca em um vetor, o tamanho do vetor deve estar no comeco*/
char **nome_campo(char *file_name)
{
    FILE *ap_file;
    int num_campos=0,i=0,n=0,t;
    char **nome_campo;
    char *vetor;
    
    num_campos = Le_num_campo(file_name); //para saber quantos campos existem
    
    nome_campo = (char**)malloc(sizeof(char*)*num_campos);
    
    ap_file = fopen(file_name, "r");
    fseek (ap_file, 1, SEEK_SET); //anda n bytes ate achar o tamanho do vetor de nome de campos
    fscanf (ap_file,"%d",&n); //tamanho do vetor nome de campos
    vetor = (char*)malloc(sizeof(char)*n);
    fseek (ap_file, 1, SEEK_CUR); //anda n bytes ate achar o comeco do vetor nome de campos
    fgets (vetor, n+1, ap_file);
        /*for (t=0;t<n;t++)
	{
	    printf ("---%c\n", vetor[t]);
	} ----> OK*/
    nome_campo = strtoken(vetor, &num_campos);
            /*for (t=0;t<num_campos;t++)
	{
	    printf ("---%s\n", nome_campo[t]);
	} */
    fclose(ap_file);
    return nome_campo;
}



void Lista_variavel (char *file_name)
{
    FILE *ap_file;
    int num_campos=0, size=0,size2=0, i=0, a=1;
    char tam[3] , *vetor, **nome;//o vetor tam vai pegar o tamanho de cada campo, nenhum campo tera 3 digitos ou mais (tomara!),o tamanho dos campos devera sempre aparecer com 2 digitos
    
    nome = nome_campo("conf.txt");
    num_campos = Le_num_campo ("conf.txt");
    
    ap_file = fopen(file_name, "r");
    
    do
    {
	while (i<4)
	{
	    fscanf (ap_file, "%c%c%c",&tam[0],&tam[1],&tam[2]); //le os caracteres de tamanho do arquivo de configuracao
	    size2 = (atoi(tam))/100;
	    size = (atoi(tam))%100; //agora temos o tamanho do campo na variavel "size"
	    vetor = (char*)malloc(sizeof(char)*size+1); //aloca um vetor com o tamanho necessario
	    if(fgets(vetor,size+1,ap_file)==NULL)
		{
		    a =0;
		    free (vetor);
		    break;
		}
	    printf ("%s:%s ",nome[size2-1], vetor);
	    printf ("(tamanho do campo:%d)\n", size);
	    free (vetor);
	    i++;
	}
	i =0;
    }
    while (a);
    fclose(ap_file);
}

int main ()
{
Lista_variavel("data.txt");

return 0;
}
